package com.taxx.excel.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.taxx.entity.TaxPlatformReport;
import com.taxx.enums.ReportStatusEnums;
import com.taxx.excel.PlatformExcelData;
import com.taxx.service.TaxPlatformReportService;
import com.taxx.util.DateUtil;
import com.taxx.util.ValidationUtil;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

/**
 * 平台信息Excel导入监听器
 *
 * @author taxx
 * @since 2024-01-01
 */
@Slf4j
public class PlatformExcelListener extends AnalysisEventListener<PlatformExcelData> {

    /**
     * -- SETTER --
     * 设置税务平台报告服务
     */
    @Setter
    private TaxPlatformReportService taxPlatformReportService;

    /**
     * 数据列表
     */
    private final List<TaxPlatformReport> dataList = new ArrayList<>();

    /**
     * 成功数量
     */
    private int successCount = 0;

    /**
     * 失败数量
     */
    private int failCount = 0;

    /**
     * 错误信息列表
     */
    private final List<String> errorMessages = new ArrayList<>();

    @Override
    public void invoke(PlatformExcelData data, AnalysisContext context) {
        try {
            String errorStr = validateRequiredFields(data);
            if (errorStr != null && !errorStr.isEmpty()) {
                failCount++;
                errorMessages.add(errorStr);
            } else {
                TaxPlatformReport report = convertToEntity(data);
                dataList.add(report);
                successCount++;
            }
        } catch (Exception e) {
            failCount++;
            String errorMsg = "第" + (context.readRowHolder().getRowIndex() + 1) + "行数据转换失败：" + e.getMessage();
            errorMessages.add(errorMsg);
            log.error(errorMsg, e);
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        try {
            if (!dataList.isEmpty()) {
                taxPlatformReportService.saveBatch(dataList);
                log.info("平台信息Excel导入完成，成功导入{}条，失败{}条", successCount, failCount);
            }
        } catch (Exception e) {
            log.error("批量保存平台信息失败", e);
            failCount += successCount;
            successCount = 0;
            errorMessages.add("批量保存失败：" + e.getMessage());
        }
        // 注意：不在这里清理数据，等getImportResult()被调用后再清理
    }

    /**
     * 清理数据，避免累积
     */
    public void clearData() {
        dataList.clear();
        successCount = 0;
        failCount = 0;
        errorMessages.clear();
        log.debug("平台信息监听器数据已清理");
    }

    /**
     * 转换为实体对象
     */
    private TaxPlatformReport convertToEntity(PlatformExcelData data) {
        // 必填字段校验
        validateRequiredFields(data);

        TaxPlatformReport report = new TaxPlatformReport();

        // 添加调试日志
        log.debug("Excel原始数据 - businessStartTime: '{}'", data.getBusinessStartTime());

        // 设置基本信息
        report.setTaxpayerName(data.getTaxpayerName());
        report.setCreditCode(data.getCreditCode());
        report.setPlatformName(data.getPlatformName());
        report.setPlatformId(data.getPlatformId());

        // 使用DateUtil解析并设置经营开始时间
        LocalDate parsedBusinessStartTime = DateUtil.parseDate(data.getBusinessStartTime());
        log.debug("解析后的经营开始时间: {}", parsedBusinessStartTime);
        report.setBusinessStartTime(parsedBusinessStartTime);

        report.setBusinessExitTime(DateUtil.parseDate(data.getBusinessExitTime()));
        report.setOperationTypeCode(data.getOperationTypeCode());

        // 设置默认值
        report.setReportStatus(ReportStatusEnums.WAIT_SUBMIT.getCode()); // 待报送

        report.setBatchCode(DateUtil.formatDate(LocalDate.now(), "yyyyMMdd"));

        // 添加最终实体对象的调试日志
        log.debug("转换后的实体对象 - businessStartTime: {}", report.getBusinessStartTime());

        return report;
    }

    /**
     * 必填字段校验
     */
    private String validateRequiredFields(PlatformExcelData data) {
        List<String> errors = new ArrayList<>();

        // 校验纳税人名称
        if (ValidationUtil.isEmpty(data.getTaxpayerName())) {
            errors.add(ValidationUtil.buildErrorMessage("纳税人名称", "不能为空"));
        } else if (!ValidationUtil.isLengthInRange(data.getTaxpayerName(), 2, 200)) {
            errors.add(ValidationUtil.buildErrorMessage("纳税人名称", "长度必须在2-200个字符之间"));
        }

        // 校验统一社会信用代码
        if (ValidationUtil.isEmpty(data.getCreditCode())) {
            errors.add(ValidationUtil.buildErrorMessage("统一社会信用代码", "不能为空"));
        } else if (!ValidationUtil.isValidCreditCode(data.getCreditCode())) {
            errors.add(ValidationUtil.buildErrorMessage("统一社会信用代码", "格式不正确，应为18位统一社会信用代码"));
        }

        // 校验平台名称
        if (ValidationUtil.isEmpty(data.getPlatformName())) {
            errors.add(ValidationUtil.buildErrorMessage("平台名称", "不能为空"));
        } else if (!ValidationUtil.isLengthInRange(data.getPlatformName(), 2, 200)) {
            errors.add(ValidationUtil.buildErrorMessage("平台名称", "长度必须在2-200个字符之间"));
        }

        // 校验平台ID
        if (ValidationUtil.isEmpty(data.getPlatformId())) {
            errors.add(ValidationUtil.buildErrorMessage("平台ID", "不能为空"));
        } else if (!ValidationUtil.isLengthInRange(data.getPlatformId(), 1, 100)) {
            errors.add(ValidationUtil.buildErrorMessage("平台ID", "长度必须在1-100个字符之间"));
        }

        // 校验经营开始时间
        if (ValidationUtil.isEmpty(data.getBusinessStartTime())) {
            errors.add(ValidationUtil.buildErrorMessage("经营开始时间", "不能为空"));
        } else if (!ValidationUtil.isValidDate(data.getBusinessStartTime())) {
            errors.add(ValidationUtil.buildErrorMessage("经营开始时间", "格式不正确，请使用 yyyy-MM-dd 或 yyyy/MM/dd 格式"));
        }

        // 校验操作类型代码
        if (ValidationUtil.isEmpty(data.getOperationTypeCode())) {
            errors.add(ValidationUtil.buildErrorMessage("操作类型代码", "不能为空"));
        } else if (!ValidationUtil.matches(data.getOperationTypeCode(), "^[0-9]{2}$")) {
            errors.add(ValidationUtil.buildErrorMessage("操作类型代码", "格式不正确，应为2位数字"));
        }

        boolean isExist = taxPlatformReportService.isExist(data.getCreditCode(), DateUtil.formatDate(LocalDate.now(), "yyyyMMdd"));
        if (isExist) {
            errors.add("当前批次已经存在[" + data.getCreditCode() + "]" + data.getPlatformName() + "已经存在");
        }
        dataList.forEach(item -> {
            if (item.getCreditCode().equals(data.getCreditCode())) {
                errors.add("当前批次已经存在[" + data.getCreditCode() + "]" + data.getPlatformName() + "已经存在");
            }
        });
        // 如果有校验错误，抛出异常
        if (!errors.isEmpty()) {
            String errorMsg = "数据校验失败：" + String.join("， ", errors);
            log.error(errorMsg);
            return errorMsg;
        } else {
            return null;
        }
    }

    /**
     * 获取导入结果
     */
    public ImportResult getImportResult() {
        ImportResult result = new ImportResult();
        result.setTotalCount(successCount + failCount);
        result.setSuccessCount(successCount);
        result.setFailCount(failCount);
        result.setErrorMessages(new ArrayList<>(errorMessages)); // 创建副本避免外部修改

        // 获取结果后清理数据，避免累积
        clearData();

        return result;
    }

    /**
     * 导入结果类
     */
    @Getter
    @Setter
    public static class ImportResult {
        private int totalCount;
        private int successCount;
        private int failCount;
        private List<String> errorMessages;
    }
}
